package ssm.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ssm.dao.IUserDao;
import ssm.domain.Role;
import ssm.domain.UserInfo;
import ssm.service.IUserService;

import java.util.ArrayList;
import java.util.List;

/*此处给service起别名，与security的xml配置文件相匹配*/
@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {
    /*在此处实现通过查询数据库中的user信息，并且完成UserDetails类封装，给security类使用。*/

    @Autowired
    private IUserDao userDao;

    @Autowired
    /*此处引入security框架中自动完成加密的类*/
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Override
    public List<UserInfo> findAll() throws Exception {
        return userDao.findAll();
    }



    @Override
    public void save(UserInfo userInfo) throws Exception {

        /*此处完成对密码的加密:通过类直接完成，编码的设置*/
        userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword()));
        userDao.save(userInfo);
    }

    @Override
    public UserInfo findById(String id) throws Exception {
        return userDao.findById(id);
    }

    @Override
    public List<Role> findOtherRoles(String userId) {
        return userDao.findOtherRoles(userId);
    }

    @Override
    public void addRoleToUser(String userId, String[] roleIds) {
        /*此处因为roleIds为多个数据，因此可以依次调用方法，将其存储起来*/
        for (String roleId : roleIds) {

            userDao.addRoleToUser(userId,roleId);
        }
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        /*1，先查询相关内容*/
        UserInfo userInfo = null;
        try {
            userInfo = userDao.findByUsername(username);
        } catch (Exception e) {
            e.printStackTrace();
        }

        /*2.将查询的userinfo类转为UserDetails类*/
            /*通过username与password创建一个受userdetail管理的user类，*/
            /*对于getAuthority，其中的参数为获取到的role信息。其已经被封装到userInfo中，可以直接通过其调用*/
        User user = new User(userInfo.getUsername(), userInfo.getPassword(),
                userInfo.getStatus() == 0 ? false : true,
                true, true, true,
                getAuthority(userInfo.getRoles()));



        /*关于后面是否有权限的验证，及验证权限后的跳转，全部基于该user类，由security完成*/
        return user;
    }

    /*编写一个方法，用于确定某个人的权限*/
        /*使用SimpleGrantedAuthority类实现授权*/
    public List<SimpleGrantedAuthority> getAuthority(List<Role> roles){
        /*创建一个授权集合，并且把响应的权限放入其中；当调用该方法时，代表该对象，具有其中的所有权限。*/
            List<SimpleGrantedAuthority> list = new ArrayList<SimpleGrantedAuthority>();

            /*list.add(new SimpleGrantedAuthority("ROLE_USER"));*/

            /*通过遍历的方式将查询到的role放入其中*/
        for (Role role : roles) {
            list.add(new SimpleGrantedAuthority("ROLE_"+role.getRoleName()));
        }

            return list;
    }


}
